package com.zl.gmadmin.common;


import com.zl.gmadmin.exception.BaseException;

import java.io.Serializable;
/**
 * @author zhangliang
 * @version 1.0
 * @date 2021/1/25 15:24
 */
public class ApiResponse implements Serializable {
        private static final long serialVersionUID = 8993485788201922830L;

        /**
         * 状态码
         */
        private Integer code;

        /**
         * 返回内容
         */
        private String message;

        /**
         * 返回数据
         */
        private Object data;

        /**
         * 无参构造函数
         */
        private ApiResponse() {

        }



        /**
         * 全参构造函数
         *
         * @param code    状态码
         * @param message 返回内容
         * @param data    返回数据
         */
        private ApiResponse(Integer code, String message, Object data) {
            this.code = code;
            this.message = message;
            this.data = data;
        }

        /**
         * 构造一个自定义的API返回
         *
         * @param code    状态码
         * @param message 返回内容
         * @param data    返回数据
         * @return ApiResponse
         */
        public static ApiResponse of(Integer code, String message, Object data) {
            return new ApiResponse(code, message, data);
        }

        /**
         * 构造一个成功且不带数据的API返回
         *
         * @return ApiResponse
         */
        public static ApiResponse ofSuccess() {
            return ofSuccess(null);
        }

        /**
         * 构造一个成功且带数据的API返回
         *
         * @param data 返回数据
         * @return ApiResponse
         */
        public static ApiResponse ofSuccess(Object data) {
            return ofStatus(Status.SUCCESS, data);
        }

        /**
         * 构造一个成功且自定义消息的API返回
         *
         * @param message 返回内容
         * @return ApiResponse
         */
        public static ApiResponse ofMessage(String message) {
            return of(Status.SUCCESS.getCode(), message, null);
        }

        /**
         * 构造一个有状态的API返回
         *
         * @param status 状态 {@link Status}
         * @return ApiResponse
         */
        public static ApiResponse ofStatus(Status status) {
            return ofStatus(status, null);
        }

        /**
         * 构造一个有状态且带数据的API返回
         *
         * @param status 状态 {@link IStatus}
         * @param data   返回数据
         * @return ApiResponse
         */
        public static ApiResponse ofStatus(IStatus status, Object data) {
            return of(status.getCode(), status.getMessage(), data);
        }

        /**
         * 构造一个异常的API返回
         *
         * @param t   异常
         * @param <T> {@link BaseException} 的子类
         * @return ApiResponse
         */
        public static <T extends BaseException> ApiResponse ofException(T t) {
            return of(t.getCode(), t.getMessage(), t.getData());
        }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

